package num;

/**
 * @author pengfei.hpf
 * @date 2020/3/10
 * @verdion 1.0.0
 * 866. 回文素数
 * 求出大于或等于 N 的最小回文素数。
 *
 * 回顾一下，如果一个数大于 1，且其因数只有 1 和它自身，那么这个数是素数。
 *
 * 例如，2，3，5，7，11 以及 13 是素数。
 *
 * 回顾一下，如果一个数从左往右读与从右往左读是一样的，那么这个数是回文数。
 *
 * 例如，12321 是回文数。
 *
 *
 *
 * 示例 1：
 *
 * 输入：6
 * 输出：7
 * 示例 2：
 *
 * 输入：8
 * 输出：11
 * 示例 3：
 *
 * 输入：13
 * 输出：101
 *
 *
 * 提示：
 *
 * 1 <= N <= 10^8
 * 答案肯定存在，且小于 2 * 10^8。
 */
public class PrimePalindrome {

     //TODO: 判断素数 和回文结合!!!! 注意分解问题
    public int primePalindrome(int N) {
        while (true) {
            if (isPalindrome(N) && isPrime(N))
                return N;
            N++;
            if (10_000_000 < N && N < 100_000_000)
                N = 100_000_000;
        }
    }

    private boolean isPalindrome(int num){
        if(num < 10){
            return true;
        }
        int half = 0;
        while(half < num){
            half = half * 10 + num%10;
            num = num /10;
        }
        return half/10 == num || half == num;
    }

    //TODO: 判断素数的办法!!! 练习一下!!!
    public boolean isPrime(int num) {
        if (num < 2) return false;
        int R = (int) Math.sqrt(num);
        for (int d = 2; d <= R; ++d)
            if (num % d == 0) return false;
        return true;
    }
}
